home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / ttydriv.c < prev    next >
C/C++ Source or Header  |  1989-01-13  |  2KB  |  123 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3. /* TTY input driver */
  4. #define    NULLCHAR    (char *)NULL
  5.  
  6. int ttymode;
  7. #define TTY_COOKED    0
  8. #define    TTY_RAW    1
  9.  
  10. #define    LINESIZE    256
  11.  
  12. #define    CTLU    21
  13. #define CTLR    18
  14. #define CTLW    23
  15. #define    CTLZ    26
  16.  
  17. raw()
  18. {
  19.     ttymode = TTY_RAW;
  20. }
  21.  
  22. cooked()
  23. {
  24.     ttymode = TTY_COOKED;
  25. }
  26.  
  27. /* Accept characters from the incoming tty buffer and process them
  28.  * (if in cooked mode) or just pass them directly (if in raw mode).
  29.  * Returns the number of characters available for use; if non-zero,
  30.  * also stashes a pointer to the character(s) in the "buf" argument.
  31.  */
  32.  /*Control-R added by df for retype of lines - useful in Telnet */
  33.  /*Then df got impatient and added Control-W for erasing words  */
  34.  
  35. int
  36. ttydriv(c,buf)
  37. char c;
  38. char **buf;
  39. {
  40.     static char linebuf[LINESIZE];
  41.     static char *cp = linebuf;
  42.     char *rp ;
  43.     int cnt;
  44.     int seenprint ;
  45.  
  46.     if(buf == (char **)NULL)
  47.         return 0;    /* paranoia check */
  48.  
  49.     cnt = 0;
  50.     switch(ttymode){
  51.     case TTY_RAW:
  52.         *cp++ = c;
  53.         cnt = cp - linebuf;
  54.         cp = linebuf;
  55.         break;
  56.     case TTY_COOKED:
  57.         /* Perform cooked-mode line editing */
  58.         switch(c & 0x7f){
  59.         case '\r':    /* CR and LF are equivalent */
  60.         case '\n':
  61.             *cp++ = '\r';
  62.             *cp++ = '\n';
  63.             printf("\n");
  64.             cnt = cp - linebuf;
  65.             cp = linebuf;
  66.             break;
  67.         case '\b':        /* Backspace */
  68.             if(cp != linebuf){
  69.                 cp--;
  70.                 printf("\b \b");
  71.             }
  72.             break;
  73.         case CTLR:    /* print line buffer */
  74.             printf("^R\n") ;
  75.             rp = linebuf ;
  76.             while (rp < cp)
  77.                 putchar(*rp++) ;
  78.             break ;
  79.         case CTLU:    /* Line kill */
  80.             while(cp != linebuf){
  81.                 cp--;
  82.                 printf("\b \b");
  83.             }
  84.             break;
  85.         case CTLW:    /* erase word */
  86.             seenprint = 0 ;    /* we haven't seen a printable char yet */
  87.             while (cp != linebuf) {
  88.                 cp--;
  89.                 printf("\b \b") ;
  90.                 if (isspace(*cp)) {
  91.                     if (seenprint)
  92.                         break ;
  93.                 }
  94.                 else
  95.                     seenprint = 1 ;
  96.             }
  97.             break ;
  98.         default:    /* Ordinary character */
  99.             *cp++ = c;
  100. #ifndef    AMIGA
  101.             /* ^Z apparently hangs the terminal emulators under
  102.              * DoubleDos and Desqview. I REALLY HATE having to patch
  103.              * around other people's bugs like this!!!
  104.              */
  105.             if(c != CTLZ)
  106.                 putchar(c);
  107. #endif
  108.             if(cp >= &linebuf[LINESIZE]){
  109.                 cnt = cp - linebuf;
  110.                 cp = linebuf;
  111.             }
  112.             break;
  113.         }
  114.     }
  115.     if(cnt != 0)
  116.         *buf = linebuf;
  117.     else
  118.         *buf = NULLCHAR;
  119.     fflush(stdout);
  120.     return cnt;
  121. }
  122.  
  123.